package main

import (
	"fmt"
	"sync"
	"time"
)

// Snowflake 结构体定义
type Snowflake struct {
	mu       sync.Mutex
	nodeID   int64 // 节点 ID
	seq      int64 // 序列号
	lastTime int64 // 上次生成 ID 的时间戳
}

// NewSnowflake 创建一个 Snowflake 实例
func NewSnowflake(nodeID int64) *Snowflake {
	return &Snowflake{
		nodeID:   nodeID,
		lastTime: time.Now().UnixNano() / int64(time.Millisecond),
	}
}

// GenerateID 生成一个新的 Snowflake ID
func (s *Snowflake) GenerateID() int64 {
	s.mu.Lock()
	defer s.mu.Unlock()

	now := time.Now().UnixNano() / int64(time.Millisecond)

	// 如果当前时间小于上次生成 ID 的时间戳，则等待直到下一毫秒
	if now < s.lastTime {
		for now <= s.lastTime {
			now = time.Now().UnixNano() / int64(time.Millisecond)
		}
	}

	// 如果当前时间与上次生成 ID 的时间戳相等，则增加序列号
	if now == s.lastTime {
		s.seq++
	} else {
		s.seq = 0
	}

	// 更新上次生成 ID 的时间戳
	s.lastTime = now

	// 构造 Snowflake ID
	id := (now << 22) | (s.nodeID << 10) | (s.seq % 1024)

	return id
}

func main() {
	// 创建一个 Snowflake 实例，指定节点 ID
	snowflake := NewSnowflake(2)

	// 生成订单号
	orderNumber := snowflake.GenerateID()

	fmt.Println("生成的订单号:", orderNumber)
}
